
/**
 ============================================================================
  Estrutura e métodos para acessar e manipular chunks de vídeo
 ============================================================================
 */

typedef struct {
	int idVideo;
	int indiceChunk;
	int tamanhoChunk;
	int auxValor;
} ItemChunk;

typedef struct  _chunk *PChunk;

typedef struct _chunk
{
	ItemChunk itemChunk;
	PChunk prox;
	PChunk ant;

} Chunk;



typedef struct {
	PChunk Primeiro, Ultimo;
	int size;
} ListaChunk;

/*Metodos para manipular a lista de chunks*/

void decrementarPosicao(ListaChunk *L, int auxValorInicio);

PChunk get(ListaChunk L, int idVideo, int indiceChunk);

int isListaChunkVazia(ListaChunk L);

void criarListaChunk(ListaChunk *L);

void inserirPonteiroChunk(ListaChunk *L, PChunk P);

void inserirChunk(ListaChunk *L, int idVideo, int indiceChunk, int tamanhoChunk, int auxValor);

void imprimirListaChunk(ListaChunk L);

ListaChunk *liberaListaChunk(ListaChunk L);

/*fim dos métodos para manipular a lista de chunks*/


/**
 ============================================================================
  Estrutura e métodos para acessar e manipular cache de vídeo
 ============================================================================
 */

typedef struct _itemcache
{
	ItemChunk itemChunk;
	int posicao;
	int tempoAcesso;
	struct _itemcache *prox;

} ItemCache;

typedef ItemCache *PItemCache;

typedef struct {
	PItemCache Primeiro, Ultimo;
	int size;
	int numElementos;
	int ocup;
	int tempo;
} Cache;

/*Metodos para manipular o cache*/
int isCacheVazio(Cache C);

int temEspacoCache(Cache C, int tamanho);

void exclui(Cache *C, PItemCache itemCache);

void removerItem(Cache *C, int politica);

void criarCache(Cache *C, int tamanho);

int inserirPonteiroItemCache(Cache *C, PItemCache P);

int inserirItemCache(Cache *C, PChunk chunk);

void imprimirCache(Cache C);

PItemCache getNoCache(Cache *C, PChunk chunk);

PItemCache getLRU(Cache C);

PItemCache getDistante(Cache C);

Cache *liberaCache(Cache C);

/*fim dos métodos para manipular o cache*/

